浅谈Html

概览

我的前端入门是从工作中开始的,数据开发工作中,除了是一名SQL girl外,日常也免不了画报表,写前端。

在大部分项目中,都有成熟的框架或者产品能够快速地进行Bi开发,这个时候无论是HTML、CSS或者JavaScript也好, 都是作为一种补充自定义,提供客户更需要的效果。Html我认为是对初学者最友好的一门语言,所见即所学,甚至不需要安装任何工具, 记事本打开另存为.html文档,点开即可见。 它由一系列的元素组成,开始标签+内容+结束标签,以封闭标签成对出现。

初学者总免不了把Html和CSS混为一谈,把文本内容和样式夹杂在一起,但其实Html和CSS界限是很清晰的,Html全称是Hyper Text Markup Language(超文本标记语言)),CSS全称是Cascading Style Sheets(层叠样式表),从这里就可看出,一篇文章,Html负责其内容的结构和语义,而样式布局则交给CSS实现, 这是比较清晰的实现方式,当然Html中也可以用span或者style标签渲染样式,但是建议还是各做各的,结构更加清晰。

那么Html的结构是什么样呢?我们以写文章来举例,看看在Html中怎么组织各部分,最后在网络上形成。

整体

这部分代码是所有人都要遵守的代码规范,能使你的代码结构更加清晰

标题

什么叫元数据呢?

元数据的定义是描述数据的数据,数仓中也有这个概念。那再简单一点,元数据指的是那些数据本身所携带的信息,比如作者信息,用途描述。

这其实是一开始就告诉别人,这个文档所包含的所有信息,文档,类似于论文的封面,作者申明、学校申明、研究说明,做一个简短的介绍。 在这其中包含几个重点标签。

命名规范

  1. 禁用保留字、常用访问方法
  2. 表名、字段名只能使用英文字母、数字、下划线,英文字母开头,禁止两个下划线中间出现数字,对象名的修改代价很大,对下游容易造成影响,谨慎修改。
  3. 临时表增加tmp标记,备份表增加bak标记,序列以seq标记,明确定位。
  4. 主键使用pk_,唯一约束使用uk_(另外补充一点,主键和唯一约束的区别在于:主键约束只有一个,唯一约束有多个) . 普通索引使用idx_,唯一索引使用uidx_区分。

表设计规范

  1. 表名和列名必须要有注释:这里就不需要多说了,没有中文解释纯靠猜的世界太痛苦了。

  2. 禁止使用外键和级联。

    这里解释一下什么叫做级联,比如说学生表
    中student_id是主键,那么成绩表中的student_id就是外键,如果更新了学生表的student_id,就会触发更新成绩表中的student_id,即为级联更新。

    级联更新和外键适用于单机低并发,不适合高并发、分布式环境;级联更新是强阻塞,存在数据库风暴的危险,外键则会影响插入速度。

    那么什么时候使用外键呢?在数仓建模中,我们通常会明确外键,确定表之间的关联关系,数据开发完成后,外键的完整性就可以作为数据质量判断的一层标准。

字段设计规范

  1. 表上用来做关联的字段,使用相同的数据类型,避免产生隐式转换
  2. 字段设计尤其是索引字段,建议增加默认约束或非空约束,避免后期使用is null或者nvl。
  3. 业务表中必备id,creattime,updattime,mysql中id为物理主键,设为AUTO_INCREMENT单表自增。createtime和updattime两列在追溯表是否正常插入、更新以及排查问题时非常有用,createtime可设sysdate,表示主动式创建,updattime表示被动式更新。同理在数仓中应明确业务主键,ETL批量时间,ETL加载时间。

索引设计规范

  1. 复合索引字段尽量将选择性高的字段放在前面,选择性高指的是离散度低,字段中重复数据占比高。
  2. 表中有大量DML操作的字段不适宜建索引,维护成本过高

SQL规范

  1. 避免select *
  2. SQL语句中的where子句变量,都应使用绑定变量
  3. where条件里的过滤字段上禁止使用函数或者计算操作,尤其是索引字段
  4. 避免使用左模糊和全模糊,Like使用%前缀
  5. 尽量delete where,删除明确的过滤数据或分区,减少使用exists。曾经因为在mysql中大量使用exist做delete删除筛选操作,导致整体数据库性能过慢,当然目前在公司中又遇到另一种情况,数仓批量中先删除数据后,insert报错,导致目标表无数据,这里就要求使用exists筛选删除了。
  6. 在对表进行大量增、删操作后,及时对表和索引进行统计信息更新。
  7. 增加必要的注释,例如在where a in (1,2,3)后增加代码说明,业务用途。
  8. count(列名)和count(*)是有区别的,count(*)会统计Null值所在行,而count(列名)是不会统计null行。
  9. 在某一列全为null时,count(col)不为0,但sum(col)是可以为0的,因此要注意用coalesce、nvl或者ifnull处理。

文献引用[^1]
[^1]:Java开发手册